package com.example.isak.myasd.common.utils;

import com.example.isak.myasd.common.config.R;
import freemarker.template.Configuration;
import freemarker.template.Template;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

/**
 * 模板引擎工具类
 */
public class FreeMarkerUtils {
    private Configuration configuration;
    private String encoding;
    private String exportPath;

    /**
     * 构造函数
     * 配置模板路径
     * @param encoding    
     */
    public FreeMarkerUtils(String encoding) {
        this.encoding = encoding;
        configuration = new Configuration();
        configuration.setDefaultEncoding(encoding);
        configuration.setClassForTemplateLoading(this.getClass(), "/templates");
    }

    /**
     * 获取模板
     * @param name
     * @return
     * @throws Exception    
     */
    public Template getTemplate(String name) throws Exception {
        return configuration.getTemplate(name);
    }

    /**
     * 导出word文档到指定目录
     * @param fileName  文档名称
     * @param tplName  模板名称
     * @param data   模板里面占位符所需数据
     * @param savePath   所导出文档保存路径
     * @throws Exception    
     */
    public R exportDocFile(String fileName, String tplName, Map<String, Object> data, String savePath) throws Exception {
        Map<String,Object> map = new HashMap<>();
        String split = System.getProperty("file.separator");
        savePath = savePath+split+System.currentTimeMillis()+split;
        String relativePath = split+System.currentTimeMillis()+split+fileName;
        File exportDirs = new File(savePath);
        //如果目录不存在，则创建目录
        if (!exportDirs.exists()) {
            exportDirs.mkdirs();
        }
        // 创建BufferedWriter对象：所导出的文档对象（内容为空）
        Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(exportDirs+split+fileName), encoding));
        // 将模板对象里的内容写入到所导出的文档对象（内容填充）
        getTemplate(tplName).process(data, writer);
        // 返回相对路径
        map.put("filePath",relativePath);
        return R.success(map);
    }

    /**
     * 导出word文档到客户端
     * @param response
     * @param fileName   文档名称
     * @param tplName    模板名称
     * @param data       模板里面占位符所需数据
     * @throws Exception    
     */
    public void exportDoc(HttpServletResponse response, String fileName, String tplName, Map<String, Object> data) throws Exception {
        response.reset();
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/msword");
        response.setHeader("Content-Disposition", "attachment; filename=" +  URLEncoder.encode(fileName , "UTF-8"));
        // 把本地文件发送给客户端
        Writer out = response.getWriter();
        Template template = getTemplate(tplName);
        template.process(data, out);
        out.close();
    }
}
